/**
 * SSE 服务 - 处理与后端的流式聊天连接
 */

import { API_BASE_URL } from '../config/apiConfig';

// 定义回调函数类型
export type SSEMessageCallback = (data: string) => void;
export type SSEErrorCallback = (error: Event) => void;
export type SSECompleteCallback = () => void;

// SSE 连接实例接口
export interface SSEConnection {
    close: () => void;
}

/**
 * 创建旅游聊天 SSE 连接
 * @param params 请求参数
 * @param onMessage 消息接收回调
 * @param onError 错误处理回调
 * @param onComplete 流完成回调
 * @returns 包含关闭方法的连接对象
 */
export function createTripSSEConnection(
    params: { message: string; chatId: string; userId?: string },
    onMessage: SSEMessageCallback,
    onError: SSEErrorCallback,
    onComplete: SSECompleteCallback
): SSEConnection {
    // 构建查询参数
    const queryParams = new URLSearchParams();
    queryParams.append('message', params.message);
    queryParams.append('chatId', params.chatId);
    if (params.userId) {
        queryParams.append('userId', params.userId);
    }

    // 创建 EventSource 实例
    const eventSource = new EventSource(`${API_BASE_URL}/ai/trip_app/chat?${queryParams.toString()}`, {
        withCredentials: true
    });

    // 消息接收处理
    eventSource.onmessage = (event) => {
        try {
            onMessage(event.data);
        } catch (error) {
            console.error('SSE 消息处理错误:', error);
        }
    };

    // 错误处理
    eventSource.onerror = (error) => {
        // 关闭连接前触发错误回调
        onError(error);
        eventSource.close();
        onComplete();
    };

    // 自定义结束事件处理
    eventSource.addEventListener('end', () => {
        eventSource.close();
        onComplete();
    });

    // 返回连接对象，提供关闭方法
    return {
        close: () => {
            if (eventSource.readyState !== EventSource.CLOSED) {
                eventSource.close();
                onComplete();
            }
        }
    };
}